#!/usr/bin/env bash

# Copyright 2018 Datawire. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"

source ${DIR}/../build-aux/helpers.sh

push_metrics() {
    if [[ -z "${KUBECEPTION_TOKEN}" ]] ; then
        return
    fi
    exit_code="$?"
    time=`date +%s`
    build_label=
    if [[ -n "${CIRCLE_BUILD_NUM}" ]] ; then
        build_label=",build_id=${CIRCLE_BUILD_NUM}"
    fi
    # could theoretically stick more data in here, like export the error step or something
    # but for now just going for the least intrusive change
    # with the build id we'll be able to link to build from metrics
    metric="apro_ci.kubeception_exit_code${build_label} value=$exit_code ${time}"
    influx_host="https://sw.bakerstreet.io/influxdb"
    # don't fail build if there's any weirdness here
    curl -i -XPOST --oauth2-bearer ${KUBECEPTION_TOKEN} "${influx_host}/write?db=db0&precision=s" --data-binary "${metric}" | cat
}

# This block gets a kluster from kubeception. Comment it out to switch back to kubernaut.
# The KUBECEPTION_TOKEN env var is set in the circleci webui.
if [ -n "${KUBECEPTION_TOKEN}" ]; then

    trap push_metrics EXIT
    # Use a CLAIM_NAME of kubeception, this will never conflict with kubernaut due to how we
    # construct kubernaut CLAIM_NAMEs below.
    CLAIM_NAME=kubeception
    echo ${CLAIM_NAME} > ~/kubernaut-claim.txt
    mkdir -p ~/.kube
    export DEV_KUBECONFIG=~/.kube/${CLAIM_NAME}.yaml
    # get a kluster with a 1-hour timeout (by default) that is size "medium" (by default)
    get_cluster ${DEV_KUBECONFIG} ${KUBECEPTION_TIMEOUT:-3600} ${KUBECEPTION_PROFILE:-large}
    ret=$?
    if [ "$ret" != "0" ] ; then
        exit $ret
    fi
    wait_for_kubeconfig ${DEV_KUBECONFIG}
    exit
fi

echo "Kubernaut is no longer supported; halting run"
exit 1

KUBERNAUT_VERSION=2018.10.24-d46c1f1

set -o errexit
set -o nounset
set -o xtrace

mkdir -p ~/bin
PATH=~/bin:$PATH

# Install kubernaut
curl -L -o ~/bin/kubernaut http://releases.datawire.io/kubernaut/${KUBERNAUT_VERSION}/linux/amd64/kubernaut
chmod +x ~/bin/kubernaut

# Configure kubernaut
base64 -d < "${0%/*}/kconf.b64" | ( cd ~ ; tar xzf - )
# Grab a kubernaut cluster
CLAIM_NAME=ci-${USER}-$(uuidgen)
DEV_KUBECONFIG=~/.kube/${CLAIM_NAME}.yaml
echo $CLAIM_NAME > ~/kubernaut-claim.txt
kubernaut claims delete ${CLAIM_NAME}
kubernaut claims create --name ${CLAIM_NAME} --cluster-group main
# Do a quick sanity check on that cluster
kubectl --kubeconfig ${DEV_KUBECONFIG} -n default get service kubernetes
